<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<body>
<script>
var canvas = document.createElement("canvas");
var context = canvas.getContext('2d');

function hex(number)
{
    var hexDigits = "0123456789abcdef";
    return hexDigits[number >> 4] + hexDigits[number & 0xF];
}

function pixel()
{
    var imageData = context.getImageData(0, 0, 1, 1);
    return "#" + hex(imageData.data[0]) + hex(imageData.data[1]) + hex(imageData.data[2]);
}

var black="#000000";
var red = "#ff0000";
var green = "#008000";

test(function(t) {
    // (save set restore)
    context.fillStyle = "black";
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), black);
    
    context.save();
    context.fillStyle = "red";
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), red);
    
    context.restore();
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), black);
    
    // (save (save set restore) restore)
    context.fillStyle = "black";
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), black);
    
    context.save();
    
    context.save();
    context.fillStyle = "red";
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), red);
    
    context.restore();
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), black);
    
    context.restore();
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), black);
    
    // (save (save restore) set restore)
    context.fillStyle = "black";
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), black);
    
    context.save();
    context.restore();
    
    context.save();
    context.fillStyle = "red";
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), red);
    
    context.restore();
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), black);
    
    // (save (save (save set restore) set (save set restore) restore) restore)
    context.fillStyle = "black";
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), black);
    
    context.save();
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), black);
    
    context.save();
    context.fillStyle = "red";
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), red);
    
    context.restore();
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), black);
    
    context.fillStyle = "green";
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), green);
    
    context.save();
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), green);
    
    context.fillStyle = "red";
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), red);
    
    context.restore();
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), green);
    
    context.restore();
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), black);
    
    context.restore();
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), black);
    
    // (save (save set (save (save set restore) restore) set restore) restore)
    context.fillStyle = "black";
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), black);
    
    context.save();
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), black);
    
    context.save();
    context.fillStyle = "red";
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), red);
    
    context.save();
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), red);
    
    context.save();
    context.fillStyle = "green";
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), green);
    
    context.restore();
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), red);
    
    context.restore();
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), red);
    
    context.fillStyle = "green";
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), green);
    
    context.restore();
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), black);
    
    context.restore();
    context.fillRect(0, 0, 1, 1);
    assert_equals(pixel(), black);
}, "Verfiy canvas save and restore correct behavior.");
</script>
</body>
</html>